聚合框架

1. 概述

MongoDB 的聚合框架(Aggregation Framework)是一个强大的工具,用于对数据进行复杂的分析和处理。它允许你通过一系列的阶段(stages)来处理数据,每个阶段执行特定的操作,如过滤、分组、排序、计算等。聚合框架非常适合用于数据分析、报表生成和复杂查询。

2. 聚合管道(Aggregation Pipeline)

聚合框架的核心是聚合管道。一个聚合管道由多个阶段组成,每个阶段对输入的文档进行处理,并将结果传递给下一个阶段。最终的结果是所有阶段的组合效果。

2.1 基本语法

聚合管道的基本语法如下:

db.collection.aggregate([
    { $stage1: { ... } },
    { $stage2: { ... } },
    ...
])

其中,$stage1, $stage2 等是聚合阶段的操作符,每个阶段可以包含不同的参数。

3. 常用聚合阶段

3.1 $match

$match 阶段用于过滤文档,类似于查询操作。它使用查询语法来选择符合条件的文档。

示例:

db.orders.aggregate([
    { $match: { status: "completed" } }
])

这个阶段会过滤出所有 status 为 "completed" 的订单。

3.2 $group

$group 阶段用于分组文档,并对每个分组进行聚合操作。你可以使用 $group 来计算总和、平均值、最大值、最小值等。

示例:

db.orders.aggregate([
    { $group: { _id: "$customer_id", total: { $sum: "$amount" } } }
])

这个阶段会按 customer_id 分组,并计算每个客户的订单总金额。

3.3 $sort

$sort 阶段用于对文档进行排序。你可以按一个或多个字段进行升序或降序排序。

示例:

db.orders.aggregate([
    { $sort: { amount: -1 } }
])

这个阶段会按 amount 字段降序排序订单。

3.4 $project

$project 阶段用于选择或排除字段,类似于查询中的字段选择。你还可以使用 $project 来重命名字段或创建新的计算字段。

示例:

db.orders.aggregate([
    { $project: { customer_id: 1, amount: 1, _id: 0 } }
])

这个阶段会只选择 customer_id 和 amount 字段,并排除 _id 字段。

3.5 $unwind

$unwind 阶段用于展开数组字段,将每个数组元素转换为一个单独的文档。

示例:

db.orders.aggregate([
    { $unwind: "$items" }
])

这个阶段会将每个订单中的 items 数组展开,生成多个文档,每个文档对应一个 item。

4. 实践练习

4.1 练习1:计算每个客户的订单总金额

假设你有一个 orders 集合,每个文档包含 customer_id 和 amount 字段。请编写一个聚合管道,计算每个客户的订单总金额。

解决方案:

db.orders.aggregate([
    { $group: { _id: "$customer_id", totalAmount: { $sum: "$amount" } } }
])

4.2 练习2:按订单金额排序并选择前10个订单

假设你有一个 orders 集合,每个文档包含 amount 字段。请编写一个聚合管道,按订单金额降序排序,并选择前10个订单。

解决方案:

db.orders.aggregate([
    { $sort: { amount: -1 } },
    { $limit: 10 }
])

5. 总结

聚合框架是 MongoDB 中一个非常强大的工具,适用于各种复杂的数据处理任务。通过掌握聚合管道的各个阶段,你可以轻松地进行数据分析、报表生成和复杂查询。希望本教程能帮助你更好地理解和使用 MongoDB 的聚合框架。

6. 下一步

在掌握了聚合框架的基础知识后,你可以进一步学习如何使用聚合框架进行更复杂的操作,如嵌套聚合、使用 $lookup 进行表连接、以及如何优化聚合管道的性能。